home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src_win / WinHTTrack / NewProj.cpp < prev    next >
C/C++ Source or Header  |  2004-12-12  |  15KB  |  570 lines

  1. // NewProj.cpp : implementation file
  2. //
  3.  
  4. // pour lecture dir
  5. //#include "kernel32.h"
  6.  
  7. #include "stdafx.h"
  8. #include "Shell.h"
  9. #include "NewProj.h"
  10.  
  11. /* Externe C */
  12. extern "C" {
  13.   #include "HTTrackInterface.h"
  14.   #include "htscore.h"
  15. }
  16.  
  17. #include "XSHBrowseForFolder.h"
  18.  
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25. extern HICON httrack_icon;
  26. extern CNewProj* dialog0;
  27.  
  28. // Helper
  29. extern LaunchHelp* HtsHelper;
  30.  
  31. /* Main WizTab frame */
  32. #include "WizTab.h"
  33. extern CWizTab* this_CWizTab;
  34.  
  35. /* Main splitter frame */
  36. #include "DialogContainer.h"
  37. #include "splitter.h"
  38. extern CSplitterFrame* this_CSplitterFrame;
  39.  
  40. /* DirTreeView */
  41. #include "DirTreeView.h"
  42. extern CDirTreeView* this_DirTreeView;
  43.  
  44. /* reference sur objet Wid1 */
  45. #include "Wid1.h"
  46. extern Wid1* dialog1;
  47.  
  48. /* shellapp */
  49. extern CShellApp* CShellApp_app;
  50.  
  51. /* crΘation structure */
  52. extern "C" HTSEXT_API int structcheck(char* s);
  53.  
  54.  
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CNewProj dialog
  57.  
  58. IMPLEMENT_DYNCREATE(CNewProj, CPropertyPage)
  59.  
  60. CNewProj::CNewProj()
  61.     : CPropertyPage(CNewProj::IDD)
  62. {
  63.   dialog0=this;    /* NOTER REFERENCE */
  64.   can_click_next=TRUE;
  65.     //{{AFX_DATA_INIT(CNewProj)
  66.     m_projname = _T("");
  67.     m_projpath = _T("");
  68.     m_projcateg = _T("");
  69.     //}}AFX_DATA_INIT
  70. }
  71.  
  72. CNewProj::~CNewProj() {
  73.   dialog0=NULL;
  74. }
  75.  
  76.  
  77. void CNewProj::DoDataExchange(CDataExchange* pDX)
  78. {
  79.     CPropertyPage::DoDataExchange(pDX);
  80.     //{{AFX_DATA_MAP(CNewProj)
  81.     DDX_Control(pDX, IDC_projcateg, m_ctl_projcateg);
  82.     DDX_Control(pDX, IDC_projname, m_ctl_projname);
  83.     DDX_Text(pDX, IDC_projname, m_projname);
  84.     DDX_Text(pDX, IDC_projpath, m_projpath);
  85.     DDX_CBString(pDX, IDC_projcateg, m_projcateg);
  86.     //}}AFX_DATA_MAP
  87. }
  88.  
  89.  
  90. #define wm_CEasyDropTargetCallback (WM_USER + 1)
  91. BEGIN_MESSAGE_MAP(CNewProj, CPropertyPage)
  92.     //{{AFX_MSG_MAP(CNewProj)
  93.     ON_BN_CLICKED(IDC_br, Onbr)
  94.     ON_EN_CHANGE(IDC_projpath, OnChangeprojpath)
  95.     ON_CBN_EDITCHANGE(IDC_projname, OnChangeprojname)
  96.     ON_WM_CREATE()
  97.     ON_CBN_SELCHANGE(IDC_projname, OnSelchangeprojname)
  98.     //}}AFX_MSG_MAP
  99.   ON_COMMAND(ID_HELP_FINDER,OnHelpInfo2)
  100.   ON_COMMAND(ID_HELP,OnHelpInfo2)
  101.     ON_COMMAND(ID_DEFAULT_HELP,OnHelpInfo2)
  102.   ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify )
  103.   //
  104.   ON_MESSAGE( wm_CEasyDropTargetCallback, DragDropText)
  105. END_MESSAGE_MAP()
  106.  
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CNewProj message handlers
  109.  
  110. CString CNewProj::GetBasePath() {
  111.   CString st=m_projpath;
  112.   st.Replace('/','\\');
  113.   st+="\\";
  114.   return st;
  115. }
  116.  
  117. CString CNewProj::GetName() {
  118.   return m_projname;
  119. }
  120.  
  121. CString CNewProj::GetPath0() {
  122.   CString st=m_projpath;
  123.   st.Replace('/','\\');
  124.   st+="\\";
  125.   st+=m_projname;
  126.   return st;
  127. }
  128.  
  129. CString CNewProj::GetPath() {
  130.   CString st=GetPath0();
  131.   st+="\\";
  132.   return st;
  133. }
  134.  
  135. LRESULT CNewProj::OnWizardNext() {
  136.   CString st,stp="";
  137.   char tempo[8192];
  138.  
  139.   GetDlgItemText(IDC_projpath,stp);
  140.   strcpybuff(tempo,stp);
  141.   if ((tempo[strlen(tempo)-1]=='/') || (tempo[strlen(tempo)-1]=='\\'))
  142.     tempo[strlen(tempo)-1]='\0';
  143.   stp=tempo;
  144.  
  145.   // ecrire
  146.   CString strSection       = "DefaultValues";    
  147.   CWinApp* pApp = AfxGetApp();
  148.   pApp->WriteProfileString(strSection,"BasePath",stp);
  149.  
  150.   GetDlgItemText(IDC_projname,st);
  151.   st.TrimLeft();
  152.   st.TrimRight();
  153.   strcpybuff(tempo,st);
  154.   // caractΦres interdits
  155.   {
  156.     int i;
  157.     char* a=NULL;
  158.     for(i=0;i<9;i++)
  159.       while(a=strchr(tempo,("\\/:*?\"<>|")[i])) 
  160.         *a=' ';
  161.   }
  162.   //
  163.   //while(a=strchr(tempo,' ')) *a='_';      // PAS de _
  164.   SetDlgItemTextCP(this, IDC_projname,tempo);
  165.  
  166.   // ModifiΘ et sauvable
  167.   GetDlgItemText(IDC_projpath,stp);
  168.   if ((stp.Right(1)!="\\") && (stp.Right(1)!="/"))    // ajouter /
  169.     stp+="\\";
  170.   GetDlgItemText(IDC_projname,st);
  171.   this_CSplitterFrame->SetNewName(stp+st+".whtt");
  172.   //GetDlgItemText(IDC_projpath,st);
  173.   //this_CSplitterFrame->GetActiveDocument()->SetPathName(st);
  174.  
  175.   // Hack
  176.   {
  177.     CString st;
  178.     GetDlgItemText(IDC_projcateg, st);
  179.     this_CSplitterFrame->SetCurrentCategory(st);
  180.   }
  181.  
  182.   if (can_click_next)
  183.     return 0;
  184.   else
  185.     return -1;
  186. }
  187.  
  188. void CNewProj::Onbr() 
  189. {
  190.   CString st,spth;
  191.   char pth[256];
  192.   GetDlgItemText(IDC_projpath,spth);
  193.   strcpybuff(pth,spth);
  194.   st=XSHBrowseForFolder(this->m_hWnd,"Select a path name for mirror",pth);
  195.   if (st.GetLength()>0) {
  196.     if (st.Right(1)=='\\')
  197.       st=st.Left(st.GetLength()-1);
  198.     SetDlgItemTextCP(this, IDC_projpath,st);
  199.   }
  200.  
  201. }
  202.  
  203. BOOL CNewProj::OnInitDialog() 
  204. {
  205.     CPropertyPage::OnInitDialog();
  206.   SetIcon(httrack_icon,false);
  207.   SetIcon(httrack_icon,true);
  208.   EnableToolTips(true);     // TOOL TIPS
  209.   SetForegroundWindow();   // yop en premier plan!
  210.  
  211.   // disabled
  212.   OnChangeprojname();
  213.  
  214.   // Patcher l'interface pour les Franτais ;-)
  215.   if (LANG_T(-1)) {    // Patcher en franτais
  216.     SetWindowTextCP(this,  LANG(LANG_S10));
  217.     // SetDlgItemTextCP(this, IDOK,LANG(LANG_NEXT )); // "SUIVANT ->");
  218.     // SetDlgItemTextCP(this, IDCANCEL,LANG(LANG_QUIT));  // exit 
  219.     SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11));
  220.     SetDlgItemTextCP(this, IDC_STATIC_basepath,LANG(LANG_S12));
  221.     SetDlgItemTextCP(this, IDC_STATIC_projcateg,LANG(LANG_S13));
  222.     //SetDlgItemTextCP(this, IDC_STATIC_updtcontinue,LANG(LANG_S13));
  223.   }
  224.   
  225.   CString strSection       = "DefaultValues";    
  226.   CWinApp* pApp = AfxGetApp();
  227.   CString st;
  228.  
  229.   st = pApp->GetProfileString(strSection, "BasePath");
  230.   if (m_projpath.GetLength()==0) {
  231.     if (st != "")
  232.       SetDlgItemTextCP(this, IDC_projpath,st);    
  233.     else
  234.       SetDlgItemTextCP(this, IDC_projpath,LANG(LANG_S20));    
  235.   }
  236.  
  237.   return TRUE;
  238. }
  239.  
  240. void CNewProj::OnChangeprojpath() 
  241. {
  242.   CWaitCursor wait;
  243.   CString st;
  244.   CString old_name;
  245.   char tempo[HTS_URLMAXSIZE*2];
  246.  
  247.   GetDlgItemText(IDC_projname,old_name);
  248.   GetDlgItemText(IDC_projpath,st);
  249.   tempo[0] = '\0';
  250.   strcatbuff(tempo, st);
  251.   if ((tempo[strlen(tempo)-1]=='/') || (tempo[strlen(tempo)-1]=='\\')) {
  252.     tempo[strlen(tempo)-1]='\0';
  253.     //SetDlgItemTextCP(this, IDC_projpath,tempo);
  254.   }
  255.   strcatbuff(tempo,"\\");
  256.  
  257.   // chargement de la liste
  258.   m_ctl_projname.ResetContent();
  259.   m_ctl_projcateg.ResetContent();
  260.   WIN32_FIND_DATA find;
  261.   char  pth[MAX_PATH + 32];
  262.   strcpybuff(pth,tempo);
  263.   strcatbuff(pth,"*.*");
  264.   HANDLE h = FindFirstFile(pth,&find);
  265.   if (h != INVALID_HANDLE_VALUE) {
  266.     do {
  267.       if (find.dwFileAttributes  & FILE_ATTRIBUTE_DIRECTORY )
  268.       if (!(find.dwFileAttributes  & (FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN) ))
  269.       if (strcmp(find.cFileName,".."))
  270.         if (strcmp(find.cFileName,".")) {
  271.           CString st;
  272.           st=tempo;
  273.           st=st+find.cFileName;
  274.           st=st+"\\hts-cache";
  275.           
  276.           WIN32_FIND_DATA find2;
  277.           HANDLE h2 = FindFirstFile(st,&find2);
  278.           if (h2 != INVALID_HANDLE_VALUE) {
  279.             FindClose(h2);
  280.             m_ctl_projname.AddString(find.cFileName);
  281.             
  282.             // Read category
  283.             st += "\\winprofile.ini";
  284.             CString strSection       = "OptionsValues";
  285.             CString categ = MyGetProfileString(st, strSection, "Category");
  286.             if (categ.GetLength() > 0 && m_ctl_projcateg.FindStringExact(0, categ) < 0) {
  287.               m_ctl_projcateg.AddString(categ);
  288.             }
  289.           }
  290.         }
  291.     } while(FindNextFile(h,&find));
  292.     FindClose(h);
  293.   }
  294.  
  295.   // nouveau nom!
  296.   SetDlgItemTextCP(this, IDC_projname,old_name);
  297.   OnChangeprojname();
  298. }
  299.  
  300.  
  301.  
  302. // ------------------------------------------------------------
  303. // TOOL TIPS
  304. //
  305. // ajouter dans le .cpp:
  306. // remplacer les deux Wid1:: par le nom de la classe::
  307. // dans la message map, ajouter
  308. // ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify )
  309. // dans initdialog ajouter
  310. // EnableToolTips(true);     // TOOL TIPS
  311. //
  312. // ajouter dans le .h:
  313. // char* GetTip(int id);
  314. // et en generated message map
  315. // afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
  316. BOOL CNewProj::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
  317. {
  318.   TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
  319.   UINT nID =pNMHDR->idFrom;
  320.   if (pTTT->uFlags & TTF_IDISHWND)
  321.   {
  322.     // idFrom is actually the HWND of the tool
  323.     nID = ::GetDlgCtrlID((HWND)nID);
  324.     if(nID)
  325.     {
  326.       char* st=GetTip(nID);
  327.       if (st != "") {
  328.         pTTT->lpszText = st;
  329.         pTTT->hinst = AfxGetResourceHandle();
  330.         return(TRUE);
  331.       }
  332.     }
  333.   }
  334.   return(FALSE);
  335. }
  336. char* CNewProj::GetTip(int ID)
  337. {
  338.   switch(ID) {
  339.     case IDC_projname:  return LANG(LANG_S1); break;
  340.     case IDC_projpath:  return LANG(LANG_S2); break;
  341.     case IDC_projcateg: return LANG(LANG_S5); break;
  342.     //case IDC_projlist:  return LANG(LANG_S3); break;
  343.     case IDC_br:        return LANG(LANG_S4); break;
  344.     case IDCANCEL:     return LANG(LANG_G20); break; // "Quit WinHTTrack","Quittter WinHTTrack"); break;
  345.     case IDOK:         return LANG(LANG_G23); break; // "Click to continue","Clic pour continuer"); break;
  346.   }
  347.   return "";
  348. }
  349. // TOOL TIPS
  350. // ------------------------------------------------------------
  351.  
  352.  
  353. void CNewProj::OnChangeprojname() 
  354. {
  355.   CString stl;
  356.   BOOLEAN modified = FALSE;
  357.   int i;
  358.   GetDlgItemText(IDC_projname,stl);
  359.   for(i = 0 ; i < stl.GetLength() ; i++) {
  360.     if (stl[i] == '\"') {
  361.       stl.GetBuffer(0)[i] = '\'';
  362.       modified = TRUE;
  363.     }
  364.     else if (stl[i] == ',' 
  365.       || stl[i] == '~'
  366.       || stl[i] == '\\'
  367.       || stl[i] == '/'
  368.       || stl[i] == ':'
  369.       || stl[i] == '*'
  370.       || stl[i] == '?'
  371.       || stl[i] == '<'
  372.       || stl[i] == '>'
  373.       || stl[i] == '|'
  374.       || stl[i] == '#'
  375.       || stl[i] == '$'
  376.       || ((unsigned char)stl[i]) < 32
  377.       ) {
  378.       stl.GetBuffer(0)[i] = '_';
  379.       modified = TRUE;
  380.     }
  381.   }
  382.   if (modified) {
  383.     DWORD dwSel=0;
  384.     dwSel = m_ctl_projname.GetEditSel();
  385.     SetDlgItemTextCP(this, IDC_projname, stl);
  386.     m_ctl_projname.SetEditSel(HIWORD(dwSel), LOWORD(dwSel));
  387.   }
  388.   Changeprojname(stl);
  389. }
  390.  
  391.  
  392. void CNewProj::Changeprojname(CString stl) {
  393.   CWaitCursor wait;
  394.   CString st;
  395.   //
  396.   if (stl.GetLength()==0 || stl.GetLength() > HTS_URLMAXSIZE) {
  397.     //m_ctl_idok.ModifyStyle(0,WS_DISABLED);
  398.     SetDlgItemTextCP(this, IDC_STATIC_comments,LANG(LANG_S30));
  399.     SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11c));
  400.     this_CWizTab->SetWizardButtons(PSWIZB_BACK);
  401.     can_click_next=FALSE;
  402.   } else {
  403.     char tempo[HTS_URLMAXSIZE*2];
  404.     GetDlgItemText(IDC_projpath,st);
  405.     if (st.GetLength() + stl.GetLength() + 32 > sizeof(tempo)) {
  406.       can_click_next=FALSE;
  407.     } else {
  408.       strcpybuff(tempo,st);
  409.       strcatbuff(tempo,"/");
  410.       strcatbuff(tempo,stl);
  411.       strcatbuff(tempo,"/");
  412.       if (fexist(fconcat(tempo,"hts-cache/winprofile.ini"))     // un cache est prΘsent
  413.         && fsize(fconcat(tempo,"hts-cache/winprofile.ini"))>0) {   // taille log contr⌠le>0
  414.         CString strSection       = "OptionsValues";
  415.         CString st  = MyGetProfileString(fconcat(tempo,"hts-cache/winprofile.ini"),strSection,"CurrentUrl");
  416.         CString st2 = MyGetProfileString(fconcat(tempo,"hts-cache/winprofile.ini"),strSection,"Category");
  417.         //
  418.         SetDlgItemTextCP(this, IDC_STATIC_comments, st);
  419.         SetDlgItemTextCP(this, IDC_projcateg, st2);
  420.         // Static
  421.         SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11b));
  422.       } else {
  423.         SetDlgItemTextCP(this, IDC_STATIC_comments,LANG(LANG_S31));
  424.         SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11));
  425.       }
  426.       //m_ctl_idok.ModifyStyle(WS_DISABLED,0);
  427.       //if (!can_click_next)
  428.       this_CWizTab->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT);
  429.       can_click_next=TRUE;
  430.     }
  431.   }
  432.   //m_ctl_idok.RedrawWindow();
  433. }
  434.  
  435.  
  436. // help
  437. // Appel aide
  438. void CNewProj::OnHelpInfo2() {
  439.   (void)  OnHelpInfo(NULL);
  440. }
  441.  
  442. BOOL CNewProj::OnHelpInfo(HELPINFO* dummy) 
  443. {
  444.   //return CPropertyPage::OnHelpInfo(pHelpInfo);
  445.   //AfxGetApp()->WinHelp(0,HELP_FINDER);    // Index du fichier Hlp
  446.   HtsHelper->Help("step1.html");
  447.   //HtsHelper->Help();
  448.   return true;
  449. }
  450.  
  451.  
  452. extern HWND App_Main_HWND;
  453. int CNewProj::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  454. {
  455.   //lpCreateStruct->hwndParent=AfxGetApp()->GetMainWnd()->m_hWnd;
  456.   lpCreateStruct->hwndParent=App_Main_HWND;
  457.     if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
  458.         return -1;
  459.     
  460.   // Drag&Drop
  461.   drag=new CEasyDropTarget(this);
  462.   if (drag->IsRegistered()) {
  463.     drag->SetTextCallback(wm_CEasyDropTargetCallback);
  464.   }
  465.     
  466.     return 0;
  467. }
  468.  
  469. // Message from CEasyDropTarget
  470. LRESULT CNewProj::DragDropText(WPARAM wParam,LPARAM lParam) {
  471.   if (lParam) {
  472.     CString st=*((CString*) lParam);
  473.     CLIPFORMAT cfFormat=wParam;
  474.     if (cfFormat==CF_HDROP) {
  475.       if (st.Right(5).CompareNoCase(".whtt")==0)
  476.         st=st.Left(st.GetLength()-5);
  477.       if(st.GetLength()<256) {
  478.         char s[256];
  479.         strcpybuff(s,st);
  480.         if (!fexist(s)) {
  481.           if (st.Find('\n')<0) {
  482.             int pos=st.ReverseFind('\\');
  483.             SetDlgItemTextCP(this, IDC_projpath,st.Mid(0,pos));
  484.             SetDlgItemTextCP(this, IDC_projname,st.Mid(pos+1));
  485.             //
  486.             OnChangeprojpath();
  487.             OnChangeprojname();
  488.           } else
  489.             AfxMessageBox(LANG(LANG_DIAL3),MB_SYSTEMMODAL);
  490.         } else
  491.           AfxMessageBox(LANG(LANG_DIAL4),MB_SYSTEMMODAL);
  492.       }
  493.     } else
  494.       AfxMessageBox(LANG(LANG_DIAL5),MB_SYSTEMMODAL);
  495.   }
  496.   return 0;
  497. }
  498.  
  499.  
  500. void CNewProj::OnSelchangeprojname() 
  501. {
  502.   CString stl;
  503.   int r;
  504.   if ((r=m_ctl_projname.GetCurSel()) != CB_ERR) {
  505.     m_ctl_projname.GetLBText(r,stl);
  506.   } else
  507.     GetDlgItemText(IDC_projname,stl);
  508.   Changeprojname(stl);
  509. }
  510.  
  511. BOOL CNewProj::OnSetActive( ) {
  512.   //this_CWizTab->SetWizardButtons(PSWIZB_BACK);
  513.  
  514.   WHTT_LOCATION("NewProj");
  515.   //if (!can_click_next) {
  516.   // structure visible
  517.   CString st;
  518.   GetDlgItemText(IDC_projpath,st);    
  519.   this_DirTreeView->EnsureVisible(st+"\\index.html");
  520.   SetDlgItemTextCP(this_CWizTab, IDCANCEL,LANG_CANCEL);
  521.   //} else
  522.   //this_CWizTab->PressButton(PSBTN_NEXT);
  523.   
  524.   return 1;
  525. }
  526.  
  527. BOOL CNewProj::OnQueryCancel( ) {
  528.   this_CSplitterFrame->SetNewView(0,1,RUNTIME_CLASS(CDialogContainer));
  529.   return 0;
  530. }
  531.  
  532. BOOL CNewProj::OnKillActive( ) {
  533.   CString st;
  534.   char tempo[HTS_URLMAXSIZE*2];
  535.   GetDlgItemText(IDC_projpath,st);
  536.   strcpybuff(tempo,st);
  537.   if ((tempo[strlen(tempo)-1]=='/') || (tempo[strlen(tempo)-1]=='\\')) {
  538.     tempo[strlen(tempo)-1]='\0';
  539.     SetDlgItemTextCP(this, IDC_projpath,tempo);
  540.   }
  541.  
  542.   UpdateData(TRUE);         // DoDataExchange
  543.  
  544.   // crΘer structure
  545.   {
  546.     char dest[HTS_URLMAXSIZE*2];
  547.     int i=0;
  548.     strcpybuff(dest,GetPath()+"hts-cache\\");
  549.     {
  550.       char* a;
  551.       while(a=strchr(dest,'\\')) *a='/';
  552.       structcheck(dest);
  553.     }
  554.   }
  555.  
  556.   CShellApp_app->end_path=dialog0->GetBasePath();
  557.   CShellApp_app->end_path_complete=dialog0->GetPath();
  558.   Build_TopIndex(FALSE);
  559.  
  560.   // structure visible
  561.   this_DirTreeView->EnsureVisible(GetPath()+"hts-cache");
  562.  
  563.   // charger prΘfs
  564.   dialog1->OnChangepathlog();
  565.  
  566.   return 1;
  567. }
  568.  
  569.  
  570.